﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RLProject1.Model.AMEEWorld;

namespace RLProject1.UnitTest
{
    [TestClass]
    public class WorldImageTest
    {
        [TestMethod]
        public void WorldImage_GetAction() {
            //Tiling
            float[] radienF = { 2.0f, 4.0f };
            int uIntervalle = 1;
            int sektoren = 4; // O, N, W, S
            Tiling tiling = new Tiling(uIntervalle, sektoren, radienF);
            //WorldImage
            WorldImage testObj = new WorldImage(tiling, 1, 1, (x, y) => 0.42);

            //Erwartete Ergebnisse:
            AMEEAction[] erwartet = new AMEEAction[8];
            erwartet[0] = new AMEEAction { Abschnittsnummer = 0, SpurNummer = 0, SektorNummer = 0, X = 1.0, Y = 0.0 };
            erwartet[1] = new AMEEAction { Abschnittsnummer = 1, SpurNummer = 0, SektorNummer = 1, X = 0.0, Y = 1.0 };
            erwartet[2] = new AMEEAction { Abschnittsnummer = 2, SpurNummer = 0, SektorNummer = 2, X = -1.0, Y = 0.0 };
            erwartet[3] = new AMEEAction { Abschnittsnummer = 3, SpurNummer = 0, SektorNummer = 3, X = 0.0, Y = -1.0 };
            erwartet[4] = new AMEEAction { Abschnittsnummer = 4, SpurNummer = 1, SektorNummer = 0, X = 3.0, Y = 0.0 };
            erwartet[5] = new AMEEAction { Abschnittsnummer = 5, SpurNummer = 1, SektorNummer = 1, X = 0.0, Y = 3.0 };
            erwartet[6] = new AMEEAction { Abschnittsnummer = 6, SpurNummer = 1, SektorNummer = 2, X = -3.0, Y = 0.0 };
            erwartet[7] = new AMEEAction { Abschnittsnummer = 7, SpurNummer = 1, SektorNummer = 3, X = 0.0, Y = -3.0 };

            // Resultate
            AMEEAction[] resultat = new AMEEAction[8];
            resultat[0] = testObj.GetAction(0, 0);
            resultat[1] = testObj.GetAction(0, 1);
            resultat[2] = testObj.GetAction(0, 2);
            resultat[3] = testObj.GetAction(0, 3);
            resultat[4] = testObj.GetAction(1, 0);
            resultat[5] = testObj.GetAction(1, 1);
            resultat[6] = testObj.GetAction(1, 2);
            resultat[7] = testObj.GetAction(1, 3);

            for (int i = 0; i < erwartet.Length; i++) {
                Assert.AreEqual<int>(erwartet[i].Abschnittsnummer, resultat[i].Abschnittsnummer, "Erwartet Abschnittsnummer: {0}\nBekommen Abschnittsnummer: {1}", erwartet[0].Abschnittsnummer, resultat[0].Abschnittsnummer);
                Assert.AreEqual<int>(erwartet[i].SpurNummer, resultat[i].SpurNummer, "Erwartet SpurNummer: {0}\nBekommen SpurNummer: {1}", erwartet[0].SpurNummer, resultat[0].SpurNummer);
                Assert.AreEqual<int>(erwartet[i].SektorNummer, resultat[i].SektorNummer, "Erwartet SektorNummer: {0}\nBekommen SektorNummer: {1}", erwartet[0].SektorNummer, resultat[0].SektorNummer);
                // Toleranz Mikro
                Assert.AreEqual(erwartet[i].X, resultat[i].X, 0.000001, "Erwartet X: {0}\nBekommen X: {1}", erwartet[0].X, resultat[0].X);
                Assert.AreEqual(erwartet[i].Y, resultat[i].Y, 0.000001, "Erwartet Y: {0}\nBekommen Y: {1}", erwartet[0].Y, resultat[0].Y);
            }
        }
    }
}
